package utils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;

import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailUtils 
{

	public static final String SERV_SMTP = "157.253.236.88";
	public static final String SERV_IMAP = "157.253.236.88";
	public static final String SERV_POP3 = "157.253.236.88";
	
	public static final String LOGIN_3 = "usuario3@infracom.com";
	public static final String PASSWORD_3 = "123abc456!D";
	public static final String LOGIN_2 = "usuario2@infracom.com";
	public static final String PASSWORD_2 = "123abc456!B";
	public static final int CORREOS_DESCARGA = 20;

	private MailUtils(){}

	public static String darContenidoMensaje(Message mensaje) throws IOException, MessagingException
	{
		Object contenido = mensaje.getContent();
		if (contenido instanceof Multipart)
		{
			StringBuffer contMensaje = new StringBuffer();
			Multipart multipart = (Multipart)contenido;
			for (int i = 0; i < multipart.getCount(); i++) 
			{
				BodyPart parte = multipart.getBodyPart(i);
				if(parte.isMimeType("text/plain"))
					contMensaje.append(parte.getContent().toString());
				else
					contMensaje.append("*****Contenido no soportado***** ("+parte.getContentType()+") \n");
			}
			return contMensaje.toString();
		}
		else
			return contenido.toString();
	}

	public static void enviarCorreo(String de, String para, String asunto, String contenido) throws Exception 
	{
		Properties props = new Properties();
		props.put("mail.smtp.host", SERV_SMTP);
		props.put("mail.smtp.port", "25");

		Session sesion = Session.getDefaultInstance(props);

		//session.setDebug(true);

		MimeMessage newMessage = new MimeMessage(sesion);
		newMessage.setFrom(new InternetAddress(de));
		newMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(para));
		newMessage.setSubject(asunto);
		newMessage.setSentDate(new Date());
		newMessage.setText(contenido);
		
//		Transport.send(newMessage);
		
		Transport t = sesion.getTransport("smtp");

		t.connect(de, PASSWORD_3);
		t.sendMessage(newMessage, newMessage.getAllRecipients());
		t.close();
	}

	public static ArrayList<Message> descargarMensajes(String tipo) throws MessagingException
	{
		Properties prop = new Properties();
		
		Session sesion = Session.getDefaultInstance(prop);
		Store store = sesion.getStore(tipo);

		if(tipo.equals("pop3"))
			store.connect(SERV_POP3, LOGIN_2, PASSWORD_2);
		else if(tipo.equals("imap"))
			store.connect(SERV_IMAP, LOGIN_2, PASSWORD_2);
		
		Folder inbox = store.getFolder("INBOX");
		inbox.open(Folder.READ_ONLY);

		int numMensaje = inbox.getMessageCount();
		int count = 0;

		ArrayList<Message> mensajes = new ArrayList<Message>();

		//Solo descargue N mensajes
		while(count < inbox.getMessageCount())
		{
			mensajes.add(inbox.getMessage(numMensaje));
			count++;
			numMensaje--;
		}
		
//		inbox.close(false);
//		store.close();
		
		return mensajes;
	}
	
	public static Message descargarMensaje(String tipo) throws MessagingException
	{
		Properties prop = new Properties();
		
		Session sesion = Session.getDefaultInstance(prop);
		Store store = sesion.getStore(tipo);

		if(tipo.equals("pop3"))
			store.connect(SERV_POP3, LOGIN_2, PASSWORD_2);
		else if(tipo.equals("imap"))
			store.connect(SERV_IMAP, LOGIN_2, PASSWORD_2);
		
		Folder inbox = store.getFolder("INBOX");
		inbox.open(Folder.READ_ONLY);

		int numMensaje = inbox.getMessageCount();
		
		Message mensaje = inbox.getMessage(numMensaje);
		
		return mensaje;
	}	

}
